package models;

import java.util.*;

import javax.persistence.*;

import play.data.validation.*;
import play.db.jpa.*;

@Entity
public class Stage extends Model{

	@ManyToOne
	public Agent organisateur;
	
	@Required
	public String code;

	@Required
	@ManyToOne (cascade=CascadeType.ALL)
	public Intitule intitule;

	@Required
	@ManyToOne (cascade=CascadeType.ALL)
	public Nature nature;

	public String modalites;

	@Required
	public String description;

	@Required
	@ManyToOne(cascade=CascadeType.ALL)
	public StructureCoord structure;

	@Required
	public double duree;

	@ManyToOne(cascade=CascadeType.ALL)
	public EtatStage etat;

	@Required
	public Date dateDeb;

	@Required
	public Date dateFin;

	public Date dateExam;

	@Required
	public Integer effectifMin;

	@Required
	public Integer effectifMax;

	@OneToOne
	public Agent directeur;

	@OneToOne
	public Agent gestionnaireAdmin;

	@ManyToOne (cascade=CascadeType.ALL)
	public Lieu lieu;

	@OneToMany(cascade=CascadeType.ALL)
	public List<Candidat> candidatures;

	public List<Candidat> getCandidatures(){
		return candidatures;
	}

	public void setCandidatures(List<Candidat> candid){
		candidatures=candid;
	}

	public Stage(String code,Intitule intitule, Nature nature, StructureCoord structure, int effectifMin, int effectifMax,
			String modalites, Lieu lieu, String description, EtatStage etat, double duree, Date dateDeb, Date dateFin, 
			Date dateExam, Agent directeur, Agent gestionnaireAdmin){
		this.intitule = intitule;
		this.etat = etat;
		this.dateDeb = dateDeb;
		this.dateFin = dateFin;
		this.dateExam=dateExam;
		this.directeur = directeur;
		this.gestionnaireAdmin = gestionnaireAdmin;
		this.description=description;
		this.nature=nature;
		this.structure=structure;
		this.duree=duree;
		this.effectifMin=effectifMin;
		this.effectifMax=effectifMax;
		this.lieu=lieu;
		this.modalites = modalites;
		this.code=code;
		candidatures=new ArrayList<Candidat>();
	}

	public void addCandidature(Candidat candidat){
		candidatures.add(candidat);
	}

	public String toString(){
		return intitule.toString();
	}

	public boolean equals(Stage s){
		return s.getCode()==this.getCode();
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public boolean contientCandidat(Candidat c){
		Iterator<Candidat> it=candidatures.iterator();
		while(it.hasNext()){
			Candidat cand=it.next();
			if(cand.equals(c) && (cand.role.equals(c.role)||cand.role.getNom().equals("stagiaire"))){	
			return true;		
			}
			if(cand.equals(c) && (c.role.getNom().equals("stagiaire")) && (cand.role.getNom().equals("Jury")||cand.role.getNom().equals("Formateur"))){	
				return true;		
			}
		}
		return false;
	}

	public int getEffectif(){
		int effectif = 0;
		Iterator<Candidat> it=this.candidatures.iterator();
		while(it.hasNext()){
			Candidat cand=it.next();
			if(cand.role.getNom().equals("Stagiaire") && cand.etatCandid.getNumEtat().equals(5)){
				effectif++;
			}
		}
		  return effectif;
	}
	
	public int getEffectifListeAttente(){
		int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Stagiaire") && c.etatCandid.getNumEtat().equals(6)){
				effectif++;
			}
		}
		return effectif;
	}
	
	public int getEffectifAnnule(){
		int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Stagiaire") && c.etatCandid.getNumEtat().equals(7)){
				effectif++;
			}
		}
		return effectif;
	}
	
	public int getNombreJury(){
	  int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Jury") && c.etatCandid.getNumEtat().equals(5)){
				effectif++;
			}
		}
		return effectif;
	}
	public int getNombreFormateur(){
	  int effectif = 0;
		Iterator<Candidat> i = this.candidatures.iterator();
		while(i.hasNext()){
			Candidat c = i.next();
			if(c.role.getNom().equals("Formateur") && c.etatCandid.getNumEtat().equals(5)){
				effectif++;
			}
		}
		return effectif;
	}
	
}
